package com.model;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

import com.common.BaseModel;
import com.type.TipoFacturaEnum;

@SuppressWarnings("serial")
@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Facturacion extends BaseModel {

	@Id
	@SequenceGenerator(name = "id", sequenceName = "FacturacionSEQ")
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "id")
	@Column(unique = true)
	private Long id;

	@Enumerated(EnumType.STRING)
	private TipoFacturaEnum tipoFactura;

	@Basic
	private Date fecha;

	@Basic
	private Date fechaCreacion;

	@Column(precision = 20, scale = 2)
	private BigDecimal neto;

	@Column(precision = 20, scale = 2)
	private BigDecimal iva;

	@Column(precision = 20, scale = 2)
	private BigDecimal total;

	@ManyToOne(fetch = FetchType.EAGER, optional = false)
	private Cliente cliente;

	@Column(length = 200, nullable = true)
	private String numero;

	@Column(length = 200, nullable = true)
	private String nombreArchivo;

	@OneToMany(orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinColumn(name = "facturacionID")
	private List<FacturacionDetalle> listaFacturacionDetalle;

	public Facturacion(Long id, TipoFacturaEnum tipoFactura, Date fecha,
			Date fechaCreacion, BigDecimal neto, BigDecimal iva,
			BigDecimal total, Cliente cliente, String numero,
			String nombreArchivo,
			List<FacturacionDetalle> listaFacturacionDetalle) {
		this.id = id;
		this.tipoFactura = tipoFactura;
		this.fecha = fecha;
		this.fechaCreacion = fechaCreacion;
		this.neto = neto;
		this.iva = iva;
		this.total = total;
		this.cliente = cliente;
		this.numero = numero;
		this.nombreArchivo = nombreArchivo;
		this.listaFacturacionDetalle = listaFacturacionDetalle;
	}

	public Facturacion() {
		this(null, TipoFacturaEnum.A, null, new Date(), null, null, null, null,
				null, null, null);
	}

	@Override
	public Long getID() {
		return id;
	}

	@Override
	public void setID(Long id) {
		this.id = id;
	}

	public TipoFacturaEnum getTipoFactura() {
		return tipoFactura;
	}

	public void setTipoFactura(TipoFacturaEnum tipoFactura) {
		this.tipoFactura = tipoFactura;
	}

	public Date getFecha() {
		return fecha;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	public Date getFechaCreacion() {
		return fechaCreacion;
	}

	public void setFechaCreacion(Date fechaCreacion) {
		this.fechaCreacion = fechaCreacion;
	}

	public BigDecimal getNeto() {
		return neto;
	}

	public void setNeto(BigDecimal neto) {
		this.neto = neto;
	}

	public BigDecimal getIva() {
		return iva;
	}

	public void setIva(BigDecimal iva) {
		this.iva = iva;
	}

	public BigDecimal getTotal() {
		return total;
	}

	public void setTotal(BigDecimal total) {
		this.total = total;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public String getNombreArchivo() {
		return nombreArchivo;
	}

	public void setNombreArchivo(String nombreArchivo) {
		this.nombreArchivo = nombreArchivo;
	}

	public List<FacturacionDetalle> getListaFacturacionDetalle() {
		return listaFacturacionDetalle;
	}

	public void setListaFacturacionDetalle(
			List<FacturacionDetalle> listaFacturacionDetalle) {
		this.listaFacturacionDetalle = listaFacturacionDetalle;
	}

}
